在控制流中§

有关 with orwith without,请参见主要文档 in context

with 语句类似于 if,但它测试的是定义性而不是真值,并且它对条件进行主题化,这与 given 非常相似

with "abc".index("a"{ .say }      # prints 0

elsif 类似,orwith 可用于链接定义性测试

# The below code says "Found a at 0" 
my $s = "abc";
with   $s.index("a"{ say "Found a at $_" }
orwith $s.index("b"{ say "Found b at $_" }
orwith $s.index("c"{ say "Found c at $_" }
else                 { say "Didn't find a, b or c" }

您可以混合使用基于 if 和基于 with 的子句。

# This says "Yes" 
if 0 { say "No" } orwith Nil { say "No" } orwith 0 { say "Yes" };

unless 一样,您可以使用 without 来检查未定义性,但您不能添加 else 子句

my $answer = Any;
without $answer { warn "Got: {$_.raku}" }

还有 withwithout 语句修饰符

my $answer = (AnyTrue).roll;
say 42 with $answer;
warn "undefined answer" without $answer;

与其他可链接的结构一样,完成 with/if..orwith/elsif 链的 else 本身将对前一个(失败的)条件主题的值进行主题化(with 的主题或最终的 orwithelsif)。

withorwith 之后的 else 的情况下,对保证未定义的值进行主题化似乎毫无用处。但当与可能失败的操作结合使用时,它会形成一个有用的习惯用法,因为 Failure 值始终未定义

sub may_fail--> Numeric:D ) {
  my $value = (^10).pick || fail "Zero is unacceptable";
  fail "Odd is also not okay" if $value % 2;
  return $value;
}
 
with may_fail() -> $value { # defined, so didn't fail 
  say "I know $value isn't zero or odd."
} else { # undefined, so failed, and the Failure is the topic 
  say "Uh-oh: {.exception.message}."
}

请注意,虽然对 Failure 进行主题化会将其标记为 handled——因此您可以使用 with/else 安全地继续执行——但这并不会使 Failure 值本身 变得安全。即使在 else 子句中,如果您尝试直接使用该值,也会导致您的 else 子句本身失败(或者在 Rakudo 中,“提升”Failure 成为抛出的异常)。

但如上所见,您可以 使用 else 主题化的已处理 Failure 对象的方法,例如 exception,如果您希望提供诊断或询问底层 Exception